
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of DetCompraAlmacenamientoData.
	/// </summary>
	public class DetCompraAlmacenamientoData : Singleton<DetCompraAlmacenamientoData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods


		/// <summary>
		/// Selects all records from the DetCompraAlmacenamiento table by a foreign key.
		/// </summary>
		public DetCompraAlmacenamiento Obtener(int compraID, int loteID, short almacenID)
		{
			var detCompraAlmacenamiento = default(DetCompraAlmacenamiento);
			var comando = BaseDatos.GetStoredProcCommand("SelectDetCompraAlmacenamiento");

			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					detCompraAlmacenamiento = new DetCompraAlmacenamiento
					{
						compraID = lector.IsDBNull(lector.GetOrdinal("compraID"))? default(int) : lector.GetInt32(lector.GetOrdinal("compraID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
                        cantidad = MathExpression.Round(Convert.ToSingle(lector.GetValue(lector.GetOrdinal("cantidad"))))
					};
				}
			}
			comando.Dispose();
			return detCompraAlmacenamiento;
		}

		/// <summary>
		/// Saves a record to the DetCompraAlmacenamiento table.
		/// </summary>
		public int Agregar(int compraID, DetCompraAlmacenamiento detCompraAlmacenamiento, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertDetCompraAlmacenamiento");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, detCompraAlmacenamiento.loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, detCompraAlmacenamiento.almacenID);
			BaseDatos.AddInParameter(comando, "cantidad", DbType.Single, MathExpression.Round(detCompraAlmacenamiento.cantidad));

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Agregar DetCompraAlmacenamiento.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the DetCompraAlmacenamiento table.
		/// </summary>
		public bool Modificar(DetCompraAlmacenamiento detCompraAlmacenamiento)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateDetCompraAlmacenamiento");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, detCompraAlmacenamiento.compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, detCompraAlmacenamiento.loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, detCompraAlmacenamiento.almacenID);
			BaseDatos.AddInParameter(comando, "cantidad", DbType.Single, MathExpression.Round(detCompraAlmacenamiento.cantidad));

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar DetCompraAlmacenamiento.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetCompraAlmacenamiento table by its primary key.
		/// </summary>
		public bool Eliminar(int compraID, int loteID, short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetCompraAlmacenamiento");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetCompraAlmacenamiento.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetCompraAlmacenamiento table by a foreign key.
		/// </summary>
		public void EliminarPorAlmacenID(short almacenID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetCompraAlmacenamientoByAlmacenID");
			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetCompraAlmacenamiento.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the DetCompraAlmacenamiento table by a foreign key.
		/// </summary>
		public void EliminarPorCompraIDLoteID(int compraID, int loteID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetCompraAlmacenamientoByCompraIDAndLoteID");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetCompraAlmacenamiento.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the DetCompraAlmacenamiento table by a foreign key.
		/// </summary>
		public IList<DetCompraAlmacenamiento> ListarPorAlmacenID(short almacenID)
		{
			var entidades = new List<DetCompraAlmacenamiento>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetCompraAlmacenamientoByAlmacenID");

			BaseDatos.AddInParameter(comando, "almacenID", DbType.Int16, almacenID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetCompraAlmacenamiento
					{
						compraID = lector.IsDBNull(lector.GetOrdinal("compraID"))? default(int) : lector.GetInt32(lector.GetOrdinal("compraID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
                        cantidad = MathExpression.Round(Convert.ToSingle(lector.GetValue(lector.GetOrdinal("cantidad"))))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the DetCompraAlmacenamiento table by a foreign key.
		/// </summary>
		public IList<DetCompraAlmacenamiento> ListarPorCompraIDLoteID(int compraID, int loteID)
		{
			var entidades = new List<DetCompraAlmacenamiento>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetCompraAlmacenamientoByCompraIDAndLoteID");

			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetCompraAlmacenamiento
					{
						compraID = lector.IsDBNull(lector.GetOrdinal("compraID"))? default(int) : lector.GetInt32(lector.GetOrdinal("compraID")),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID")),
						almacenID = lector.IsDBNull(lector.GetOrdinal("almacenID"))? default(short) : lector.GetInt16(lector.GetOrdinal("almacenID")),
                        cantidad = MathExpression.Round(Convert.ToSingle(lector.GetValue(lector.GetOrdinal("cantidad"))))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
